前幾天已經學會 Python 的基本語法、資料結構、函式、檔案處理,以及如何使用 Requests 取得網頁內容和 BeautifulSoup 解析 HTML。
從今天開始,會把這些內容整合起來,正式進入網頁爬蟲的實作。
這次選擇 Books to Scrape 作為練習網站,實際抓取書籍名稱、價格、庫存狀態和評分,並將資料整理成 Python 的 List 和 Dictionary,最後進行簡單的資料分析。
今天的重點是理解一個完整的爬蟲流程:發送請求 → 解析 HTML → 擷取資料 → 整理資料 → 初步分析。
一、認識今天的練習網站
今天使用的網站是 Books to Scrape。
這是一個專門提供網頁爬蟲練習的網站,頁面中有許多書籍資料,包含書名、價格、庫存狀態和評分,很適合用來練習資料擷取。
網站網址:https://books.toscrape.com/
在開始寫程式之前,先觀察網頁的內容,了解我們要抓取哪些資訊。
這次預計取得以下四個欄位:
title
書籍名稱
price
書籍價格
availability
庫存狀態
rating
書籍評分
這些資料原本分散在網頁的 HTML 結構中,接下來會透過 Python 將它們整理成方便分析的格式。
二、實作一:使用 Requests 取得網頁內容
首先,在 Google Colab 建立一個新的 Notebook,並匯入 Requests 套件。
Requests 可以用來向網站發送 HTTP 請求,取得伺服器回傳的網頁內容。
import requests
url = "https://books.toscrape.com/
"
response = requests.get(url, timeout=10)
print("狀態碼:", response.status_code) print(response.text[:500])
這段程式碼主要分成三個部分。
第一,使用 requests.get() 向網站發送 GET 請求。
第二,將回傳的結果存放在 response 變數中。
第三,使用 response.status_code 確認請求狀態,並透過 response.text 取得 HTML 原始碼。
如果狀態碼是 200,通常代表請求成功。
這裡使用 [:500] 是為了只顯示前 500 個字元,避免整個網頁的 HTML 一次輸出太多內容。
執行結果
正常情況下,可以看到類似以下的輸出:
狀態碼:200
接著會顯示網頁 HTML 的開頭內容,例如 、 和 等標籤。
這代表我們已經成功取得網頁原始碼,接下來就可以開始解析 HTML。
三、實作二:使用 BeautifulSoup 解析 HTML
取得 HTML 之後,接著使用 BeautifulSoup 將原始碼轉換成方便搜尋的結構。
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
print(soup.title.text)
這裡使用 BeautifulSoup() 解析 HTML,並將結果存放在 soup 變數中。
"html.parser" 是 Python 內建的 HTML 解析器,可以用來讀取網頁的標籤結構。
接著使用 soup.title.text 取得網頁標題的文字內容。
這個步驟的目的,是讓我們不需要直接處理整份 HTML 字串,而是可以透過標籤名稱、class 或 CSS Selector 找到需要的資料。
找出所有書籍區塊
在 Books to Scrape 的網頁中,每本書都放在 article 標籤裡,並且具有 product_pod 這個 class。
因此,可以使用 CSS Selector 一次找出所有書籍。
books = soup.select("article.product_pod")
print("找到的書籍數量:", len(books))
這裡的 select() 可以使用 CSS Selector 搜尋符合條件的元素。
article.product_pod 的意思是尋找標籤名稱為 article,而且 class 是 product_pod 的元素。
len(books) 則可以確認目前取得了多少個書籍區塊。
這樣就能將網頁中的每本書分別取出,方便後續逐一處理。
四、實作三:抓取第一本書的名稱與價格
找到書籍區塊後,先從第一本書開始練習。
book = books[0]
title = book.select_one("h3 a")["title"] price = book.select_one(".price_color").text
print("書名:", title) print("價格:", price)
這裡使用 books[0] 取得 List 中的第一本書。
接著使用 select_one() 找出書名和價格。
書名位於 h3 標籤裡面的 a 標籤中,而完整書名可以從 title 屬性取得。
價格則位於 class 為 price_color 的元素中,因此可以透過 .text 取得文字內容。
這個步驟讓我們先確認選取的 HTML 元素是否正確,再將相同的方式套用到其他書籍。
將價格轉換成數字
目前取得的價格可能是 £51.77 這樣的字串。
如果想要計算平均價格或比較價格,就必須先移除貨幣符號,再將字串轉換成數字。
price_text = book.select_one(".price_color").text
price = float(price_text.replace("£", ""))
print("原始價格:", price_text) print("轉換後價格:", price)
這裡使用 replace("£", "") 移除英鎊符號,再使用 float() 將價格轉換成浮點數。
轉換完成後,價格就可以用來進行數值運算。
五、實作四:取得庫存狀態與評分
除了書名和價格,這次也會抓取書籍的庫存狀態和評分。
book = books[0]
availability = book.select_one(".availability").text.strip()
rating_element = book.select_one(".star-rating") rating = rating_element["class"][1]
print("庫存狀態:", availability) print("評分:", rating)
庫存狀態可以透過 .availability 找到,再使用 strip() 移除前後多餘的空白和換行。
評分則是從 star-rating 這個元素的 class 取得。
網站會用 One、Two、Three、Four、Five 表示一到五星,因此這裡取得的評分是英文文字,而不是數字。